/*
 * @(#)Bucket.java	1.0 06/22/11
 *
 * Copyright 2011 Ice Spring All rights reserved.
 * Mrogrape/Javaliang.com PROPRIETARY.
 */
package com.mrogrape.util;

import java.util.Collection;
import java.util.LinkedList;
import java.util.Random;

/**
 * 一个模拟的，用来存放数据的桶。
 * 
 * <p>
 * 用户可以将数据放到桶中并在需要时取出。桶通过一个链表来管理数据，所以桶中的数据是有
 * 序的（但是我们通常不关心这个顺序）。当我们取出数据时，可以选择随机取出数据或指定数
 * 据的下标，该数据在取出的同时会从桶中移除。
 * 
 * @author Ice Spring
 *
 * @param <E> 存放的数据类型。
 * @version 1.0 06/22/11
 */
public class Bucket<E> {

    /**
     * 构造一个桶。
     */
    public Bucket(){
	this.content = new LinkedList<E>();
    }

    /**
     * 构造一个桶。
     */
    public Bucket(Collection<? extends E> elements){
	this.content = new LinkedList<E>(elements);
    }

    /**
     * 向桶中放入一个对象。
     * 
     * @param e 需要放入桶的数据对象。
     */
    public void put(E e){
	this.content.add(e);
    }

    /**
     * 从桶中随机取出一条数据。
     * 
     * @return 取出的数据。
     */
    public E take(){
	int index = this.random.nextInt(this.content.size());
	return this.take(index);
    }

    /**
     * 从桶中取出指定位置的数据。
     * 
     * @param index 数据存放位置。
     * @return 取出的数据。
     */
    public E take(int index){
	E e = this.content.get(index);
	this.content.remove(index);
	return e;
    }

    /**
     * 返回桶的大小（存放的数据对象数量）。
     * 
     * @return 桶的大小。
     */
    public int size(){
	return this.content.size();
    }

    private Random random = new Random();
    private LinkedList<E> content = null;

}
